package jmcnet.libcommun.communs.errormanager
{
	import flash.events.Event;
	import flash.events.EventDispatcher;
	import flash.utils.getQualifiedClassName;
	
	import jmcnet.libcommun.logger.JMCNetLog4JLogger;
	
	import mx.controls.Alert;
	import mx.events.CloseEvent;
	import mx.messaging.messages.ErrorMessage;
	import mx.resources.ResourceManager;

	/**
	 * Dispatched when the user logs in with success.
	 * @eventType	flash.event.Event.popupClosed
	 * @see			Event#popupClosed
	 */
	[Event(name=EVT_POPUP_CLOSED, type="flash.event.Event")]
	public class MessageManager extends EventDispatcher
	{
		private var log:JMCNetLog4JLogger = new JMCNetLog4JLogger(flash.utils.getQualifiedClassName(this));
		private static var instance:MessageManager=null;
		
		public static const EVT_POPUP_CLOSED:String="popupClosed";
		
		[Embed(source="assets/warning.png")]
		public var WarningClass:Class;
		
		[Embed(source="assets/error.png")]
		public var ErrorClass:Class;
		
		[Embed(source="assets/info.png")]
		public var InfoClass:Class;
		
		[Embed(source="assets/error-small.png")]
		public var ErrorSmallClass:Class;
		
		public var nomFichierLibellesErreurs:String="libellesErreurs";
		
		/**
		 * C'est un singleton et ca ne devrait pas être instanciable
		 */
		public function MessageManager() {
			if (instance != null) {
				throw new Error("ErrorManager ne devrait pas être instanciée plus d'une fois");
			}
		}
		
		public static function getInstance():MessageManager {
			if (instance == null) {
				instance = new MessageManager();
			}
			
			return instance;
		}
		
		public function afficherMessage(type:EnumTypeError, codeErreur:String, params:Array=null):void {
			var msg:String =rechercheLibelleErreur(codeErreur, params);
			var alert:Alert = null;
			switch (type) {
				case EnumTypeError.TYPE_Erreur:
					 alert = Alert.show(msg,"Erreur",Alert.OK, null, dispatchCloseEvent, ErrorClass, Alert.OK);
					alert.icon = ErrorSmallClass;
					break;
				
				case EnumTypeError.TYPE_Warning:
					alert = Alert.show(msg,"Attention",Alert.OK, null, dispatchCloseEvent, WarningClass, Alert.OK);
					alert.icon = ErrorSmallClass;
					break;
				
				default:
					alert = Alert.show(msg,"Information",Alert.OK, null, dispatchCloseEvent, InfoClass, Alert.OK);
					alert.icon = ErrorSmallClass;
					break;
			}
		}
		
		private function dispatchCloseEvent(evt:CloseEvent):void {
			this.dispatchEvent(new Event(EVT_POPUP_CLOSED));
		}
		
		public function afficherMessageFromErrorMessage(errorMsg:ErrorMessage):void {
			var type:EnumTypeError = EnumTypeError.TYPE_Info;
			if (errorMsg.faultCode.indexOf("erreur.") != 0) {
				type = EnumTypeError.TYPE_Erreur;
			}
			else if (errorMsg.faultCode.indexOf("warning.") != 0) {
				type = EnumTypeError.TYPE_Warning;
			}
			
			if (errorMsg.extendedData != null) {
				afficherMessage(type, errorMsg.faultCode, [ errorMsg.extendedData.param0, errorMsg.extendedData.param1, errorMsg.extendedData.param2, errorMsg.extendedData.param3] );
			}
			else {
				afficherMessage(type, errorMsg.faultCode);
			}
		}
		
		public function afficherErreur(codeErreur:String, params:Array=null):void {
			afficherMessage(EnumTypeError.TYPE_Erreur, codeErreur, params);
		}
		
		public function afficherWarning(codeWarning:String, params:Array=null):void {
			afficherMessage(EnumTypeError.TYPE_Warning, codeWarning, params);
		}
		
		public function afficherInfo(codeInfo:String, params:Array=null):void {
			afficherMessage(EnumTypeError.TYPE_Info, codeInfo, params);
		}
		
		/**
		 * Retourne le libelle de l'erreur trouvé dans le bundle si présent et remplace les paramètres s'il y en a.
		 * Si pas trouvé, le codeErreur lui même est retourné comme message. 
		 */
		private function rechercheLibelleErreur(codeErreur:String, params:Array):String {
			var msg:String = null;
			
			if (params != null) {
				msg = ResourceManager.getInstance().getString(nomFichierLibellesErreurs, codeErreur, params);
				if (msg == null) msg = "??"+ codeErreur+ "?? ("+params+")";
			}
			else {
				msg = ResourceManager.getInstance().getString(nomFichierLibellesErreurs, codeErreur);
				if (msg == null) msg = "??"+ codeErreur+ "??";
			}
			
			log.debug("libelleErreur : '"+msg+"' pour codeErreur="+codeErreur+" params="+params);
			return msg;
			
		}
		
	}
}